#ifndef __SCNS_LCD_H__
#define __SCNS_LCD_H__

#include "ScnsConfig.h"

#if defined(SCNS_LCD_ENABLE)&&SCNS_LCD_ENABLE==1

#include "ScnsYing.h"
#include "ScnsBspLcd.h"

#if SCNS_LCD_COLOR_FORMAT==SCNS_COLOR_FORMAT_RGB565

typedef ScnsColorRgb565 ScnsLcdColor;

#define SCNS_LCD_COLOR_GRAY     SCNS_COLOR_RGB565_GRAY
#define SCNS_LCD_COLOR_WHITE    SCNS_COLOR_RGB565_WHITE
#define SCNS_LCD_COLOR_BLACK    SCNS_COLOR_RGB565_BLACK

#define SCNS_LCD_COLOR_RED      SCNS_COLOR_RGB565_RED
#define SCNS_LCD_COLOR_GREEN    SCNS_COLOR_RGB565_GREEN
#define SCNS_LCD_COLOR_BLUE     SCNS_COLOR_RGB565_BLUE

#define SCNS_LCD_COLOR_YELLOW   SCNS_COLOR_RGB565_YELLOW
#define SCNS_LCD_COLOR_PURPLE   SCNS_COLOR_RGB565_PURPLE
#define SCNS_LCD_COLOR_CYAN     SCNS_COLOR_RGB565_CYAN

#define scnsLcdColorARGBToScreen(a,r,g,b)   scnsColorARGBToRgb565(a,r,g,b)
#define scnsLcdColorScreenToA(c)            scnsColorRgb565ToA(c)
#define scnsLcdColorScreenToR(c)            scnsColorRgb565ToR(c)
#define scnsLcdColorScreenToG(c)            scnsColorRgb565ToG(c)
#define scnsLcdColorScreenToB(c)            scnsColorRgb565ToB(c)
#define scnsLcdColorScreenReplaceA(c,a)     scnsColorRgb565ReplaceA(c,a)

#define scnsLcdColorRandom(i)                 scnsColorRgb565Random(i)
#define scnsLcdColorRgb565ToScreen(c)       scnsColorRgb565ToRgb565(c)
#define scnsLcdColorRgb888ToScreen(c)       scnsColorRgb888ToRgb565(c)
#define scnsLcdColorArgb8888ToScreen(c)     scnsColorArgb8888ToRgb565(c)
#define scnsLcdColorArgb4444ToScreen(c)     scnsColorArgb4444ToRgb565(c)
#elif SCNS_LCD_COLOR_FORMAT==SCNS_COLOR_FORMAT_RGB888
typedef ScnsColorRgb888 ScnsLcdColor;

#define SCNS_LCD_COLOR_GRAY         SCNS_COLOR_RGB888_GRAY
#define SCNS_LCD_COLOR_WHITE        SCNS_COLOR_RGB888_WHITE
#define SCNS_LCD_COLOR_BLACK        SCNS_COLOR_RGB888_BLACK

#define SCNS_LCD_COLOR_RED          SCNS_COLOR_RGB888_RED
#define SCNS_LCD_COLOR_GREEN        SCNS_COLOR_RGB888_GREEN
#define SCNS_LCD_COLOR_BLUE         SCNS_COLOR_RGB888_BLUE

#define SCNS_LCD_COLOR_YELLOW       SCNS_COLOR_RGB888_YELLOW
#define SCNS_LCD_COLOR_PURPLE       SCNS_COLOR_RGB888_PURPLE
#define SCNS_LCD_COLOR_CYAN         SCNS_COLOR_RGB888_CYAN

#define scnsLcdColorARGBToScreen(a,r,g,b)   scnsColorARGBToRgb888(a,r,g,b)
#define scnsLcdColorScreenToA(c)            scnsColorRgb888ToA(c)
#define scnsLcdColorScreenToR(c)            scnsColorRgb888ToR(c)
#define scnsLcdColorScreenToG(c)            scnsColorRgb888ToG(c)
#define scnsLcdColorScreenToB(c)            scnsColorRgb888ToB(c)
#define scnsLcdColorScreenReplaceA(c,a)     scnsColorRgb888ReplaceA(c,a)

#define scnsLcdColorRandom(i)                 scnsColorRgb888Random(i)
#define scnsLcdColorRgb565ToScreen(c)       scnsColorRgb565ToRgb888(c)
#define scnsLcdColorRgb888ToScreen(c)       scnsColorRgb888ToRgb888(c)
#define scnsLcdColorArgb8888ToScreen(c)     scnsColorArgb8888ToRgb888(c)
#define scnsLcdColorArgb4444ToScreen(c)     scnsColorArgb4444ToRgb888(c)
#elif SCNS_LCD_COLOR_FORMAT==SCNS_COLOR_FORMAT_ARGB8888

typedef ScnsColorArgb8888 ScnsLcdColor;

#define SCNS_LCD_COLOR_GRAY         SCNS_COLOR_ARGB8888_GRAY
#define SCNS_LCD_COLOR_WHITE        SCNS_COLOR_ARGB8888_WHITE
#define SCNS_LCD_COLOR_BLACK        SCNS_COLOR_ARGB8888_BLACK

#define SCNS_LCD_COLOR_RED          SCNS_COLOR_ARGB8888_RED
#define SCNS_LCD_COLOR_GREEN        SCNS_COLOR_ARGB8888_GREEN
#define SCNS_LCD_COLOR_BLUE         SCNS_COLOR_ARGB8888_BLUE

#define SCNS_LCD_COLOR_YELLOW       SCNS_COLOR_ARGB8888_YELLOW
#define SCNS_LCD_COLOR_PURPLE       SCNS_COLOR_ARGB8888_PURPLE
#define SCNS_LCD_COLOR_CYAN         SCNS_COLOR_ARGB8888_CYAN

#define scnsLcdColorARGBToScreen(a,r,g,b)   scnsColorARGBToArgb8888(a,r,g,b)
#define scnsLcdColorScreenToA(c)            scnsColorArgb8888ToA(c)
#define scnsLcdColorScreenToR(c)            scnsColorArgb8888ToR(c)
#define scnsLcdColorScreenToG(c)            scnsColorArgb8888ToG(c)
#define scnsLcdColorScreenToB(c)            scnsColorArgb8888ToB(c)
#define scnsLcdColorScreenReplaceA(c,a)     scnsColorArgb8888ReplaceA(c,a)

#define scnsLcdColorRandom(i)                 scnsColorArgb8888Random(i)
#define scnsLcdColorRgb565ToScreen(c)       scnsColorRgb565ToArgb8888(c)
#define scnsLcdColorRgb888ToScreen(c)       scnsColorRgb888ToArgb8888(c)
#define scnsLcdColorArgb8888ToScreen(c)     scnsColorArgb8888ToArgb8888(c)
#define scnsLcdColorArgb4444ToScreen(c)     scnsColorArgb4444ToArgb8888(c)

#define scnsLcdColorScreenToArgb8888(c)     scnsColorArgb8888ToArgb8888(c)

#elif SCNS_LCD_COLOR_FORMAT==SCNS_COLOR_FORMAT_ARGB4444

typedef ScnsColorArgb4444 ScnsLcdColor;

#define SCNS_LCD_COLOR_GRAY         SCNS_COLOR_ARGB4444_GRAY
#define SCNS_LCD_COLOR_WHITE        SCNS_COLOR_ARGB4444_WHITE
#define SCNS_LCD_COLOR_BLACK        SCNS_COLOR_ARGB4444_BLACK

#define SCNS_LCD_COLOR_RED          SCNS_COLOR_ARGB4444_RED
#define SCNS_LCD_COLOR_GREEN        SCNS_COLOR_ARGB4444_GREEN
#define SCNS_LCD_COLOR_BLUE         SCNS_COLOR_ARGB4444_BLUE

#define SCNS_LCD_COLOR_YELLOW       SCNS_COLOR_ARGB4444_YELLOW
#define SCNS_LCD_COLOR_PURPLE       SCNS_COLOR_ARGB4444_PURPLE
#define SCNS_LCD_COLOR_CYAN         SCNS_COLOR_ARGB4444_CYAN

#define scnsLcdColorARGBToScreen(a,r,g,b)   scnsColorARGBToArgb4444(a,r,g,b)
#define scnsLcdColorScreenToA(c)            scnsColorArgb4444ToA(c)
#define scnsLcdColorScreenToR(c)            scnsColorArgb4444ToR(c)
#define scnsLcdColorScreenToG(c)            scnsColorArgb4444ToG(c)
#define scnsLcdColorScreenToB(c)            scnsColorArgb4444ToB(c)
#define scnsLcdColorScreenReplaceA(c,a)     scnsColorArgb4444ReplaceA(c,a)

#define scnsLcdColorRandom(i)               scnsColorArgb4444Random(i)
#define scnsLcdColorRgb565ToScreen(c)       scnsColorRgb565ToArgb4444(c)
#define scnsLcdColorRgb888ToScreen(c)       scnsColorRgb888ToArgb4444(c)
#define scnsLcdColorArgb8888ToScreen(c)     scnsColorArgb8888ToArgb4444(c)
#define scnsLcdColorArgb4444ToScreen(c)     scnsColorArgb4444ToArgb4444(c)
#define scnsLcdColorScreenToArgb8888(c)     scnsColorArgb4444ToArgb8888(c)
#else
#error undefined or unsupport SCNS_LCD_COLOR_FORMAT
#endif
#define SCNS_LCD_COLOR_BACKGROUND   scnsLcdColorArgb8888ToScreen(SCNS_LCD_COLOR_BACKGROUND_ARGB8888)

typedef enum
{
    SCNS_LCD_BACKGROUND_LIGHT_ON,
    SCNS_LCD_BACKGROUND_LIGHT_OFF,
    
}ScnsLcdBackgroundLightStatus;

typedef enum
{
    SCNS_LCD_STATUS_OK=SCNS_YING_STATUS_OK,
    SCNS_LCD_STATUS_BSP_FAILED=SCNS_YING_STATUS_BSP_FAILED,
    SCNS_LCD_STATUS_FAILED=SCNS_YING_STATUS_FAILED,
    SCNS_LCD_STATUS_NOT_SUPPORT,
}ScnsLcdStatus;

typedef struct
{
    char name[10];
    uint8 fontHeight;
    uint8 fontAsciiWidth;
#if defined(SCNS_LCD_FONT_USE_GBK)&&SCNS_LCD_FONT_USE_GBK==1
    uint8 fontGbkWidth;
#endif
    const uint8*ascii;
#if defined(SCNS_LCD_FONT_USE_GBK)&&SCNS_LCD_FONT_USE_GBK==1
    const uint8*gbk;
#endif
}ScnsLcdFont;

#include "ScnsLcd.font.h"

extern ScnsLcdStatus scnsLcdInit(void);

extern void scnsLcdTest(ScnsLcdLayer layN);
extern Point scnsLcdTestFont(ScnsLcdLayer layN,Point plu,const ScnsLcdFont*font,ScnsLcdColor color,ScnsLcdColor bgColor,uint8 merge);
extern void scnsLcdBenchMark(ScnsLcdLayer layN,Point plu);

extern Point scnsLcdGetBorder(void);
extern void scnsLcdSetBackgroundLight(ScnsLcdBackgroundLightStatus status);
extern void scnsLcdWorkModeSet(uint8 mode);
extern void scnsLcdCommit(ScnsLcdLayer layN);
extern void scnsLcdMergeLayer(ScnsLcdLayer fgLay,ScnsLcdLayer bgLay,ScnsLcdLayer ouLay,Point plu,Point prd);
extern uint8 scnsLcdSetAddress(ScnsLcdLayer layN,Point plu,Point prd);
extern void scnsLcdWriteColor(ScnsLcdLayer layN,ScnsLcdColor color);
extern void scnsLcdWritePixel(ScnsLcdLayer layN,Point plu,ScnsLcdColor color);
extern ScnsLcdColor scnsLcdReadPixel(ScnsLcdLayer layN,Point plu);

extern void scnsLcdFill(ScnsLcdLayer layN,Point plu,int16 w,int16 h,ScnsLcdColor color,uint8 merge);
extern void scnsLcdClear(ScnsLcdLayer layN,ScnsLcdColor color);

extern void scnsLcdDisplayPoint(ScnsLcdLayer layN,Point plu,ScnsLcdColor color);
extern void scnsLcdDisplayBigPoint(ScnsLcdLayer layN,Point plu,ScnsLcdColor color);
extern void scnsLcdDisplayPolygon(ScnsLcdLayer layN,uint32 polySides,const Point poly[],ScnsLcdColor color,ScnsLcdColor bgColor);

extern Point scnsLcdDisplayRawChar(ScnsLcdLayer layN,Point plu,const uint8*font,uint32 length,uint8 height,uint8 width,ScnsLcdColor color,ScnsLcdColor bgColor,uint8 merge);
extern Point scnsLcdDisplayChar(ScnsLcdLayer layN,Point plu,uint16 dat,const ScnsLcdFont*font,ScnsLcdColor color,ScnsLcdColor bgColor,uint8 merge);
extern Point scnsLcdDisplayString(ScnsLcdLayer layN,Point plu,const char dat[],const ScnsLcdFont*font,ScnsLcdColor color,ScnsLcdColor bgColor,uint8 merge);
extern Point scnsLcdDisplayInt8(ScnsLcdLayer layN,Point plu,int8 dat,const ScnsLcdFont*font,ScnsLcdColor color,ScnsLcdColor bgColor,uint8 merge);
extern Point scnsLcdDisplayUint8(ScnsLcdLayer layN,Point plu,uint8 dat,const ScnsLcdFont*font,ScnsLcdColor color,ScnsLcdColor bgColor,uint8 merge);
extern Point scnsLcdDisplayInt16(ScnsLcdLayer layN,Point plu,int16 dat,const ScnsLcdFont*font,ScnsLcdColor color,ScnsLcdColor bgColor,uint8 merge);
extern Point scnsLcdDisplayUint16(ScnsLcdLayer layN,Point plu,uint16 dat,const ScnsLcdFont*font,ScnsLcdColor color,ScnsLcdColor bgColor,uint8 merge);
extern Point scnsLcdDisplayInt32(ScnsLcdLayer layN,Point plu,int dat,uint8 num,const ScnsLcdFont*font,ScnsLcdColor color,ScnsLcdColor bgColor,uint8 merge);
extern Point scnsLcdDisplayFloat(ScnsLcdLayer layN,Point plu,float dat,int8 num,int8 pointNum,const ScnsLcdFont*font,ScnsLcdColor color,ScnsLcdColor bgColor,uint8 merge);

extern void scnsLcdDisplayXLine(ScnsLcdLayer layN,Point plu,Point prd,ScnsLcdColor color);
extern void scnsLcdDisplayYLine(ScnsLcdLayer layN,Point plu,Point prd,ScnsLcdColor color);
extern void scnsLcdDisplayLine(ScnsLcdLayer layN,Point plu,Point prd,ScnsLcdColor color);
extern void scnsLcdDisplayLineK(ScnsLcdLayer layN,Point plu,Point prd,float k,ScnsLcdColor color);

extern void scnsLcdDisplaySquare(ScnsLcdLayer layN,Point plu,Point prd,ScnsLcdColor bc,uint8 fill,ScnsLcdColor fc,uint8 merge);
extern void scnsLcdDisplayCircle(ScnsLcdLayer layN,Point plu,uint16 r,ScnsLcdColor bc,uint8 fill,ScnsLcdColor fc,uint8 merge);
extern void scnsLcdDisplayEllipse(ScnsLcdLayer layN,Point plu,uint16 a,uint16 b,ScnsLcdColor bc,uint8 fill,ScnsLcdColor fc,uint8 merge);
extern void scnsLcdDisplayRoundSquare(ScnsLcdLayer layN,Point plu,int16 bgw,int16 bgh,ScnsLcdColor bgc,int16 gaw,int16 gah,ScnsLcdColor fgc,int16 r,uint8 merge);

extern void scnsLcdDisplayArrayImage(ScnsLcdLayer layN,Point plu,const void*p,ScnsColorFormat format,const ScnsColorArgb8888*cult,int16 w,int16 h,int16 disW,int16 disH,uint8 merge);

extern const uint8*scnsLcdFontToRawChar(uint16 dat,const ScnsLcdFont*font,uint8*getHeight,uint8*getWidth,uint8*getRowByte);
extern const char*scnsLcdGetNextChar(const char*dat);
extern Point scnsLcdGetStringWidth(const char dat[],const ScnsLcdFont*font);

extern void scnsLcdDebugPrint(void);

#if defined(SCNS_IMAGE_ENABLE)&&SCNS_IMAGE_ENABLE==1

#include "ScnsImage.h"

extern const ScnsImage*scnsLcdDisplayImage(ScnsLcdLayer layN,Point plu,const ScnsImage*image,int16 disW,int16 disH,uint8 merge);
extern ScnsImage*scnsLcdScreenShot(ScnsLcdLayer layN,ScnsColorFormat format,uint8 mergeBackground);
#if defined(SCNS_BMP_ENABLE)&&SCNS_BMP_ENABLE==1
extern void scnsLcdSave(FILE*fp,ScnsLcdLayer layN,uint8 compress,uint8 close,uint8 mergeBackground);
#endif
#endif

#endif
#endif

